"""
Раздача органицаций по принципу - КОЛИЧЕСТВО НА ЗАКАЗ
"""

import os
import sys
import datetime
import logging
import itertools
import re
import sqlite3


from PyQt5.QtWidgets import *
from PyQt5.QtGui import *


def get_curator():
    """
    Функция генератор. Возвращает фамилии кураторов для распределения.
    """
    while 1:                                                                    # для бесконечной работы генератора
        for cur in curators:                                                    # пробегаем по списку курторов
            if type(curators[cur]) == int:                                      # если в словаре число раздач
                if curators[cur] > 0:                                           # и лимит не вышел
                    curators[cur] -= 1                                          # уменьшаем на единицу
                    yield cur                                                   # выдаём фамилию куратора
            else:
                yield cur                                                       # иначе, если числа нет, просто выдаём фамилию куратора


if __name__ == '__main__':
    app = QApplication(sys.argv)
    logging.basicConfig(filename='log.txt',level=logging.DEBUG)                 # лог

    pattern = re.compile('[ ]*([А-Яа-я]+)[ ]*=[ ]*([\d]*)[ ]*')                 # шаблон для ИМЯ=число

    with open("menT.txt") as f:                                                  # читаем файл распределения вакансий
        s = f.read()                                                            # сразу весь - он мизерный
    cur = pattern.findall(s)                                                    # парсим файл распределений

    curators = {}
    for m in cur:                                                               # создаем словарь для генератора get_curator()
        try:
            curators[m[0]] = int(m[1])                                          # если указано число
        except:
            curators[m[0]] = 10000                                             # если ничего не указано, выдавать очень много
            
    conn = sqlite3.connect("distrib.db")                                        # все вакансии для распределения
    select = conn.cursor()                                                      # для обхода записей
    update = conn.cursor()                                                      # для обновления записей

    select.execute("SELECT curator, count(curator) as num "
        "FROM vacant WHERE curator <> '' GROUP BY curator;")                    # количество звонков после лексемы
    for curator, num in select:                                                 # итерация записей
        if curator in curators: # если есть в списке
            curators[curator] -= num # уменьшить на найденное количество

    famile = get_curator()                                                      # инициализация генератора
    select.execute("SELECT ROWID, curator FROM vacant "
        "WHERE curator IN ('','Супервайзер');")                                 #организации у которых нет куратора
    for val in select:                                                           # 
        name = next(famile)                                                     # следующий куратор
        sql = ("UPDATE vacant SET curator = '{}' WHERE ROWID = {}".
            format(name, val[0]))
        try:                                                                    # обработка исключения
            update.execute(sql)                                                 # Выполняем SQL-запрос
        except sqlite3.Error as e:
            logging.error('btn_find_name: {} {}'.format( e.args[0],sql))
            quit()
        else:
            conn.commit()

    for cur in curators:                                                        # вывод csv по каждому менеджеру
        select.execute("SELECT count(curator) as rowcount "                     # записей по кажодому куратору
            "FROM vacant WHERE curator = '{}'".format(cur))
        r = select.fetchone()
        if not r:   # если нет записей
            continue
        t = datetime.datetime.today()
        pref = t.strftime("%d-%I-%M")
        namef = "{}_Sam_{}.csv".format(pref, cur)
        f = open(namef, 'w')
        select.execute("SELECT org, face, phone, phone_find, org_CRM,"
            "url, curator "
            "FROM vacant WHERE curator = '{}'".format(cur))
        for org, face, phone, phone_find, org_CRM, url, curator in select:
            s = ('{}${}${}$>{}<${}$=HYPERLINK("{}")${}\n'.
            format(org, face, phone, phone_find, org_CRM, url, curator))
            f.write(s)
        f.close()

    update.executescript("DELETE FROM vacant; VACUUM;")                          # очистить рабочую таблицу и схлопуть базу
